package com.itheima.reggie.controller;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.itheima.reggie.common.R;
import com.itheima.reggie.entity.User;
import com.itheima.reggie.service.UserService;
import com.itheima.reggie.utils.SMSUtils;
import com.itheima.reggie.utils.ValidateCodeUtils;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpSession;
import java.util.Map;
import java.util.concurrent.TimeUnit;

@RestController
@RequestMapping("/user")
@Slf4j
public class UserController {
    @Autowired
   private UserService userService;
    @Autowired
    private RedisTemplate redisTemplate;
    /**
     * 发送手机短信验证码
     * @param user
     * @return
     */
    @PostMapping("/sendMsg")
    public R<String> sendMsg(@RequestBody User user, HttpSession httpSession){
//        日志。前端发送过来的数据
        log.info("前端发送过来的数据:{}",user.toString());

//        获取手机号
        String phone = user.getPhone();
//        对传回的数据进行非空判断
        if (StringUtils.isNotEmpty(phone)){
            //        设置验证码位数，要是字符串
            String code = ValidateCodeUtils.generateValidateCode(6).toString();
            //需要将生成的验证码保存到Redis,设置过期时间
            redisTemplate.opsForValue().set(phone, code, 5, TimeUnit.MINUTES);
//        日志打印下验证码
            log.info("验证码为：{}",code);
//        调用工具类发送验证码
            /*SMSUtils.sendMessage(
                    "阿里云短信测试",
                    "SMS_154950909",
                    phone,
                    code);*/

//       将生成的验证码保存到Session
//            httpSession.setAttribute(phone,code);

//        返回成功信息
            return R.success("短信发送成功");
        }
   return R.error("短信发送失败");
//        返回失败信息
    }

    /**
     * 用户登录校验
     * @param map
     * @param httpSession
     * @return
     */
    @PostMapping("/login")   //jason是个键值对，map也是
    public R<String> login(@RequestBody Map map,HttpSession httpSession){
//        控制台输出日志,前端返回的手机号和验证码
        log.info("前端传过来的信息：{}",map.toString());
//        获取手机号
        String phone = map.get("phone").toString();
        log.info("手机号：{}",phone);
//        获取验证码
        String code = map.get("code").toString();
        log.info("验证码：{}",code);
//        获取session中保存的验证码
        //从Redis中获取缓存的验证码
        Object codeInSession = redisTemplate.opsForValue().get(phone);
//        将Redis中获取缓存的验证码和请求体中的验证码进行比对
        if (codeInSession !=null && codeInSession.equals(code)){
            //        成功
//查询该用户信息
//            条件构造器，拼接条件
            LambdaQueryWrapper<User> lwq = new LambdaQueryWrapper<>();
            lwq.eq(User::getPhone,phone);
//            查询
            User user = userService.getOne(lwq);
            //判断当前手机号对应的用户是否为新用户，如果是新用户就自动完成注册
//        若该用户不存在，创建个用户对象，把信息把基本信息存进去,存的没查到的那个对象
            if (user == null) {
//                创建对象
                user = new User();
//                设置手机号
                user.setPhone(phone);
                //        状态设为1，启用
                user.setStatus(1);
//               将该用户信息保存到数据库中
                userService.save(user);

            }

            //        将该用户信息存到session中

            httpSession.setAttribute("user",user.getId());
            //从Redis中删除缓存的验证码
            redisTemplate.delete(phone);
//返回登录成功信息
         return R.success("登陆成功");
        }

//失败
//        直接返回登录失败信息，验证码不对
        return R.error("登录失败");
    }
    /**
     * 用户退出
     *
     * @param session
     * @return
     */
    @PostMapping("/loginout")
    public R<String> logOut(HttpSession session) {
//        退出时清理员工信息
        session.removeAttribute("user");

        return R.success("退出成功");
    }
}
